<?php
namespace app\server\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
use Workerman\Events\EventInterface;


/**
 * Created by SimplerWorker
 * 这仅仅是一个测试文件，今后可能删除，请不要在意
 * User: xiaojun.lan
 * Date: 2018/5/9
 * Time: 11:27
 */
class Worker extends Server
{
//    protected $socket = 'websocket://www.tp5019.cc:2346';
//    protected $socket = 'websocket://172.20.10.2:2346';
    protected $socket = 'websocket://0.0.0.0:2346'; // 协议类型
    protected $processes = 8; // 开启的进程数


    /**
     * 当客户端通过连接发来数据时（收到数据时），就会触发此函数
     * @param $connection
     * @param $data
     */
    public function onMessage($connection,$data){
        // 给connection临时设置一个lastMessageTime属性，用来记录上次收到消息的时间
        $connection->lastMessageTime = time();

//		file_put_contents('./www.txt','------------------------------------------------------------>'.time().'<-----------------------------------------------------------'.PHP_EOL,FILE_APPEND);
//		file_put_contents('./www.txt',$data.PHP_EOL,FILE_APPEND);
		
        $connection->send('server return: success , recy data: ' );
//        $connection->send(file_get_contents('D:/test/yantai201801011755.sql'));





    }

    /**
     * 当连接建立时触发的回调函数，每个连接只会触发一次onConnect回调，此时只能获取对方ip地址，没有其它
     * 可以鉴别客户端的数据或者信息，所以在onConnect事件里无法确认对方是谁。想要知道对方是谁，需要客户端
     * 发送鉴权数据，例如某个token或者用户密码之类，在onMessage回掉里做鉴权
     * @param $connection
     */
    public function onConnect($connection){
        echo 'connect id:'.$connection->getRemoteIp()."\n";// 获取客户端的ip地址
    
	}

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection){
    
	}

    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection,$code,$msg){
        echo "error $code $msg\n";

    }

    /**
     * 设置Worker子进程启动时的回掉函数，每个子进程启动时都会执行。
     * 本回掉函数是在每个子进程启动时都会运行一次，4个之进程，则执行4次
     * 可以执行定时任务
     * @param $worker
     */
    public function onWorkerStart($worker){


        # 1. 心跳处理，防止防火墙等关闭长时间不通讯的连接
        Timer::add(1, function()use($worker){
            $time_now = time();
            foreach($worker->connections as $connection) {
                // 有可能该connection还没收到过消息，则lastMessageTime设置为当前时间
                if (empty($connection->lastMessageTime)) {
                    $connection->lastMessageTime = $time_now;
                    continue;
                }
                // 上次通讯时间间隔大于心跳间隔，则认为客户端已经下线，关闭连接( 25秒发一次心跳 ）
                if ($time_now - $connection->lastMessageTime > 25) {
                    $connection->close();
                }
            }
        });

//        echo "worker->count= {$worker->count} \n"; // 当前子进程数量
//        echo "worker->id= {$worker->id} \n"; // 当前子进程id

        $timeInterVal = 2;
//        Timer::add($timeInterVal,function () use ($worker){

//            foreach ($worker->connections as $connection){
//                $connection->send(time()); // 向所有链接定时发送当前时间戳
//            }

//            echo "worker->user={$worker->user} \n"; // 打印当前worker 用户

//        });

	}

    /**
     * 执行 php server.php reload 时，每个子进程执行一次
     * @param $worker
     */
	public function onWorkerReload($worker){

	    echo "onWorkerReload \n";

    }

    /**
     * 发送数据缓冲区，默认1M，当要发送的数据大于缓冲区大小时，多余数据被抛弃，并触发onError回调
     * @param $connection
     */
    public function onBufferFull($connection){

    }

    /**
     * 当连接的应用层发送缓冲区数据全部发送完毕时触发
     * @param $connection
     */
    public function onBufferDrain($connection){
        echo "send finish onBufferDrain \n";

    }
}


